El mercado de los videojuegos, un área de interés común para los integrantes del grupo, ha crecido muchísimo en los últimos años. Esto se aprecia tanto al observar la cantidad de personas aficionadas a este hobby, la variedad de juegos publicados cada año, y los avances en gráficos y otras tecnologías que se ha logrado con el tiempo.
Resulta interesante además porque plataformas como Steam e Itch.io permiten que desarrolladores independientes o grupos pequeños de éstos puedan ser visibilizados y publicar sus juegos sin necesitar de grandes inversiones, volviendo alcanzable ingresar y/o dedicarse al área.
El dataset escogido para el proyecto corresponde a información respecto a videojuegos recopilada de la plataforma Steam. Fue obtenido originalmente de Kaggle.
Por un lado, considerando que se ha presenciado en persona la evolución de los videojuegos, resulta atractiva la idea de encontrar (más allá de la impresión personal que se pueda tener) evidencia tangible de tendencias que se han dado respecto a los juegos con el paso de los años.
Observando lo vigente que resulta el área, y aprovechando la oportunidad del proyecto de este curso, se aspirará también a identificar patrones que puedan resultar provechosos al momento de elegir ciertas características que tendrá un juego, tal que incluirlos pueda significar un mayor interés por parte del público.
La descarga consta de 6 archivos, donde la información más importante respecto a los juegos se encuentra en steam.csv.
A continuación se describen los atributos de la tabla principal, steam.csv.
Para mayor facilidad en la interpretación de los precios fue necesario convertirlos a la moneda local (CLP). No confundir con los precios reales en la tienda de Chile.
Adicionalmente, existen otros atributos que de forma similar a las compañías desarrolladoras y distribuidoras, se encontraban separadas con punto y coma, pero al ser una cantidad de opciones más reducida, se decidió pre-procesar los datos y transformar cada uno de los atributos en columnas adicionales indicando si incluyen o no cierta característica, entre todas las opciones posibles. Corresponden a los siguientes:
El dataset original no contiene elementos vacíos (NaN) y posee 27075 observaciones que corresponden a los juegos presentes en la plataforma steam.
if (!require('tidyverse')) install.packages('tidyverse'); library('tidyverse')
if (!require('splitstackshape')) install.packages('splitstackshape'); library('splitstackshape')
steam <- read.csv("data/steam.csv", encoding = "UTF-8", as.is = F)
platforms <- str_split(steam$platforms, ";")
categories <- str_split(steam$categories, ";")
genres <- str_split(steam$genres, ";")
platforms <- unlist(platforms)
categories <- unlist(categories)
genres <- unlist(genres)
platforms <- unique(platforms)
categories <- unique(categories)
genres <- unique(genres)
steam <- cSplit(steam, "platforms", sep=";")
steam <- cSplit(steam, "categories", sep=";")
steam <- cSplit(steam, "genres", sep=";")
for (i in platforms){
steam <- steam %>%
mutate(!!i := if_any(starts_with("platforms"), ~ ifelse(.x == i,1,0)))
}
for (i in categories){
steam <- steam %>%
mutate(!!i := if_any(starts_with("categories"), ~ ifelse(.x == i,1,0)))
}
for (i in genres){
steam <- steam %>%
mutate(!!i := if_any(starts_with("genres"), ~ ifelse(.x == i,1,0)))
}
GBP_TO_CLP_RATE <- 1085
steam$price <- round(steam$price * GBP_TO_CLP_RATE)
steam <- steam %>%
mutate_at(c(53:113), ~ifelse(is.na(.x)==T | .x ==F,0,1))
Medidas de tendencia central, dispersión y rango de variables númericas.
steam %>%
select(achievements,positive_ratings,negative_ratings,average_playtime,median_playtime,
price) %>%
summary()
## achievements positive_ratings negative_ratings average_playtime
## Min. : 0.00 Min. : 0 Min. : 0 Min. : 0.0
## 1st Qu.: 0.00 1st Qu.: 6 1st Qu.: 2 1st Qu.: 0.0
## Median : 7.00 Median : 24 Median : 9 Median : 0.0
## Mean : 45.25 Mean : 1001 Mean : 211 Mean : 149.8
## 3rd Qu.: 23.00 3rd Qu.: 126 3rd Qu.: 42 3rd Qu.: 0.0
## Max. :9821.00 Max. :2644404 Max. :487076 Max. :190625.0
## median_playtime price
## Min. : 0.0 Min. : 0
## 1st Qu.: 0.0 1st Qu.: 1834
## Median : 0.0 Median : 4329
## Mean : 146.1 Mean : 6595
## 3rd Qu.: 0.0 3rd Qu.: 7801
## Max. :190625.0 Max. :457859
english no resultará muy útil pues casi todos los juegos están en inglés (lo que es esperable al ser Steam una plataforma originalmente en este idioma).achievements, aunque existen algunos que parecieran enfocarse en lo contrario y presentan un número absurdamente alto de logros.positive_ratings y negative_ratings en caso de comparar juegos entre sí, pues sino los juegos “más populares” posiblemente terminarían opacando a los demás.average_playtime como median_playtime tienen mediana cero.Dado que buena parte de los valores de las variables average_playtime y median_playtime están fuertemente concentrados en 0, a continución se muestran sus valores de tendencia central filtrando que sean mayor a cero (sólo para objetivos de análisis).
steam %>%
select(average_playtime,median_playtime) %>%
filter(average_playtime>0 & median_playtime>0) %>%
summary()
## average_playtime median_playtime
## Min. : 1.0 Min. : 1.0
## 1st Qu.: 77.0 1st Qu.: 77.0
## Median : 222.0 Median : 228.0
## Mean : 657.4 Mean : 640.9
## 3rd Qu.: 365.0 3rd Qu.: 371.0
## Max. :190625.0 Max. :190625.0
Una enorme cantidad de juegos no tiene logros: un 43% del total.
# Juegos sin achievements:
steam %>% filter(achievements==0) %>% nrow()
## [1] 11864
# Juegos con 1 o más achievements:
steam %>% filter(achievements!=0) %>% nrow()
## [1] 15211
Para estudiar un poco más la distribución de la cantidad de logros se descartaron los casos donde no habían. En general parecen centrarse alrededor de 20 logros. Se observa una pequeña tendencia de juegos con más logros a llegar a un número cerrado (50), pero fuera de esta anomalía lo esperable es que una mayor cantidad de logros se vuelve cada vez más inusual.
ggplot(steam[steam$achievements<100 & steam$achievements>0,], aes(x = achievements)) +
geom_density()
A continuación, se muestran los tabulados correspondientes a los 10 juegos con mayor cantidad de positive_ratings, de negative_ratings y también de una variable auxiliar rating_neto que corresponde a la diferencia entre los positive_ratings y negative_ratings.
steam %>%
select(name,positive_ratings) %>%
arrange(-positive_ratings) %>%
head(10)
## name positive_ratings
## 1: Counter-Strike: Global Offensive 2644404
## 2: Dota 2 863507
## 3: Team Fortress 2 515879
## 4: PLAYERUNKNOWN'S BATTLEGROUNDS 496184
## 5: Garry's Mod 363721
## 6: Grand Theft Auto V 329061
## 7: PAYDAY 2 308657
## 8: Unturned 292574
## 9: Terraria 255600
## 10: Left 4 Dead 2 251789
steam %>%
select(name,negative_ratings) %>%
arrange(-negative_ratings) %>%
head(10)
## name negative_ratings
## 1: PLAYERUNKNOWN'S BATTLEGROUNDS 487076
## 2: Counter-Strike: Global Offensive 402313
## 3: Dota 2 142079
## 4: Grand Theft Auto V 139308
## 5: Z1 Battle Royale 91664
## 6: DayZ 77169
## 7: ARK: Survival Evolved 66603
## 8: Tom Clancy's Rainbow Six® Siege 59620
## 9: PAYDAY 2 56523
## 10: No Man's Sky 56488
steam %>%
mutate(rating_neto = positive_ratings - negative_ratings) %>%
select(name,rating_neto) %>%
arrange(-rating_neto) %>%
head(10)
## name rating_neto
## 1: Counter-Strike: Global Offensive 2242091
## 2: Dota 2 721428
## 3: Team Fortress 2 481843
## 4: Garry's Mod 347288
## 5: Unturned 261092
## 6: PAYDAY 2 252134
## 7: Terraria 247803
## 8: Left 4 Dead 2 243371
## 9: The Elder Scrolls V: Skyrim 222352
## 10: Rocket League® 220745
A continuación se muestran los 10 juegos con mayor average_playtine y median_playtime. Cabe mencionar que los resultados obtenidos abren muchas dudas de la fiabilidad y validez de estas variables ya que luego de realizar un análisis cualitativo de varios de estos juegos pudimos concluir que no es esperable que posean tantas horas de juegos. Dado lo anterior, hemos decidido continuar con cautela respecto a estas variables y seguir investigando si pudiesen contener errores o outliers muy extremos.
steam %>%
select(name,average_playtime) %>%
arrange(-average_playtime) %>%
head(10)
## name average_playtime
## 1: The Abbey of Crime Extensum 190625
## 2: The Banner Saga: Factions 95245
## 3: The Secret of Tremendous Corporation 95242
## 4: PRICE 63481
## 5: Boundless 55204
## 6: Shroud of the Avatar: Forsaken Virtues 54618
## 7: X-Plane 11 44169
## 8: 懒人修仙传 43632
## 9: Fantasy Grounds 43074
## 10: Screeps 38805
steam %>%
select(name,median_playtime) %>%
arrange(-median_playtime) %>%
head(10)
## name median_playtime
## 1: The Abbey of Crime Extensum 190625
## 2: The Banner Saga: Factions 190489
## 3: The Secret of Tremendous Corporation 190445
## 4: Fantasy Grounds 86148
## 5: 懒人修仙传 71857
## 6: PRICE 63490
## 7: Boundless 55204
## 8: Shroud of the Avatar: Forsaken Virtues 54618
## 9: X-Plane 11 44169
## 10: Screeps 38805
A continuación, se muestran los 10 juegos con mayor precio en steam y también se incluyen dos tablas de los 10 juegos gratis (precio = 0) con mayor cantidad de ratings positivos y negativos.
steam %>%
select(name,price) %>%
arrange(-price) %>%
head(10)
## name price
## 1: ADR-Labelling Game 457859
## 2: GameMaker Studio 2 UWP 329829
## 3: Houdini Indie 227839
## 4: 3DF Zephyr Lite Steam Edition 168164
## 5: Tactics: Bludgeons Blessing 168164
## 6: Silhouette 168164
## 7: GameMaker Studio 2 Mobile 168164
## 8: CrisisActionVR 168164
## 9: Tactics 2: War 168164
## 10: Bible Test 168164
steam %>%
filter(price == 0) %>%
select(name,positive_ratings) %>%
arrange(-positive_ratings) %>%
head(10)
## name positive_ratings
## 1: Counter-Strike: Global Offensive 2644404
## 2: Dota 2 863507
## 3: Team Fortress 2 515879
## 4: Unturned 292574
## 5: Warframe 226541
## 6: Paladins® 169580
## 7: Life is Strange - Episode 1 118634
## 8: Z1 Battle Royale 111434
## 9: Doki Doki Literature Club! 108556
## 10: War Thunder 83852
steam %>%
filter(price == 0) %>%
select(name,negative_ratings) %>%
arrange(-negative_ratings) %>%
head(10)
## name negative_ratings
## 1: Counter-Strike: Global Offensive 402313
## 2: Dota 2 142079
## 3: Z1 Battle Royale 91664
## 4: Heroes & Generals 34416
## 5: Team Fortress 2 34036
## 6: Paladins® 32407
## 7: Unturned 31482
## 8: Robocraft 30987
## 9: War Thunder 22166
## 10: Warframe 20268
Vale la pena destacar que los datos consideran desde el año 1997 hasta 2019. Hay muy pocos juegos para los primeros años de la plataforma, así que se observó con mayor atención los años siguientes.
steam %>%
group_by(year) %>%
summarise(n = n()) %>%
ggplot(aes(x=year,y=n, label=n)) + geom_bar(stat = 'identity') +
xlab("año") +
ylab("cantidad") +
geom_text(vjust = -0.5, colour = "black", size = 2.5)
Como los datos fueron recolectados en 2019, es esperable que no se tenga información completa respecto al último año; fuera de este caso, la cantidad de juegos lanzados parece aumentar cada año.
# Confirmando el juego más reciente en la tabla (mes):
steam %>%
filter(year==2019) %>% select(month) %>% arrange(-month) %>% head(1)
## month
## 1: 5
Bajo esta consideración, también puede resultar interesante ver cómo se distribuyen a través del año.
steam %>%
group_by(year, month) %>%
summarise(n = n()) %>%
ggplot(aes(x= as.factor(month), y=n, label=n)) + geom_bar(stat = 'identity') +
xlab("mes") +
ylab("cantidad")
En este apartado se puede ver la distribución de las plataformas a lo largo del dataframe steam.
if (!require('reshape')) install.packages('reshape'); library('reshape')
steam %>%
select(windows,mac,linux) %>%
summarise_all(sum) %>%
melt() %>%
ggplot(aes(variable,value, label = value)) +
geom_bar(stat = 'identity') +
geom_text(vjust = 4, colour = "white") +
xlab("plataformas") +
ylab("cantidad")
Solo hay 3 plataformas en PC, siendo liderado por Windows.
steam %>%
mutate(aux_excl = windows + mac + linux) %>%
mutate(windows_excl = ifelse(windows == 1 & aux_excl == 1,1,0),
mac_excl = ifelse(mac == 1 & aux_excl == 1,1,0),
linux_excl = ifelse(linux == 1 & aux_excl == 1,1,0)) %>%
select(windows_excl,mac_excl,linux_excl) %>%
summarise_all(sum) %>%
melt()
## variable value
## 1 windows_excl 18398
## 2 mac_excl 3
## 3 linux_excl 1
Más aún, prácticamente nadie crea contenido exclusivo para Mac o Linux. Lo común es que los desarrolladores liberen sus juegos en Windows, y en ocasiones también deciden agregar otras plataformas.
steam %>% select(developer) %>% unique() %>% nrow()
## [1] 17113
Existen muchísimos desarrolladores en Steam; posiblemente la mayoría de estos solo publican un único juego:
steam %>%
group_by(developer) %>%
summarise(n = n()) %>%
filter(n==1) %>%
nrow()
## [1] 13266
Por su parte, algunos de los desarrolladores que producen más contenido son:
steam %>%
group_by(developer) %>%
summarise(n = n()) %>%
arrange(-n) %>%
head(10)
## # A tibble: 10 x 2
## developer n
## <fct> <int>
## 1 "Choice of Games" 94
## 2 "KOEI TECMO GAMES CO., LTD." 72
## 3 "Ripknot Systems" 62
## 4 "Laush Dmitriy Sergeevich" 51
## 5 "Nikita \"Ghost_RUS\"" 50
## 6 "Dexion Games" 45
## 7 "RewindApp" 43
## 8 "Hosted Games" 42
## 9 "Blender Games" 40
## 10 "For Kids" 36
steam %>% select(publisher) %>% unique() %>% nrow()
## [1] 14354
Las compañías distribuidoras también son muchísimas como para analizarlas individualmente. Se comporta de forma similar a los desarrolladores: gran parte de ellos se asocia solo a un juego.
steam %>%
group_by(publisher) %>%
summarise(n = n()) %>%
filter(n==1) %>%
nrow()
## [1] 11047
Algunas de las distribuidoras con más juegos a su nombre son:
steam %>%
group_by(publisher) %>%
summarise(n = n()) %>%
arrange(-n) %>%
head(10)
## # A tibble: 10 x 2
## publisher n
## <fct> <int>
## 1 Big Fish Games 212
## 2 Strategy First 136
## 3 Ubisoft 111
## 4 THQ Nordic 98
## 5 Square Enix 97
## 6 Sekai Project 96
## 7 Choice of Games 94
## 8 1C Entertainment 88
## 9 Dagestan Technology 88
## 10 SEGA 78
Existen un total de 6 categorías según el sistema inglés.
unique(steam$required_age)
## [1] 0 18 16 12 7 3
La mayor parte de los juegos no indican un rating:
steam %>% count(required_age)
## required_age n
## 1: 0 26479
## 2: 3 11
## 3: 7 12
## 4: 12 73
## 5: 16 192
## 6: 18 308
Sin embargo, esto puede deberse a que solo es importante etiquetarlos cuando se trata de juegos para mayores de edad, y que por eso la tendencia sea a aumentar la cantidad con el rating de edad.
Existe un total de 29 categorías únicas:
categories
## [1] "Multi-player" "Online Multi-Player"
## [3] "Local Multi-Player" "Valve Anti-Cheat enabled"
## [5] "Single-player" "Steam Cloud"
## [7] "Steam Achievements" "Steam Trading Cards"
## [9] "Captions available" "Partial Controller Support"
## [11] "Includes Source SDK" "Cross-Platform Multiplayer"
## [13] "Stats" "Commentary available"
## [15] "Includes level editor" "Steam Workshop"
## [17] "In-App Purchases" "Co-op"
## [19] "Full controller support" "Steam Leaderboards"
## [21] "SteamVR Collectibles" "Online Co-op"
## [23] "Shared/Split Screen" "Local Co-op"
## [25] "MMO" "VR Support"
## [27] "Mods" "Mods (require HL2)"
## [29] "Steam Turn Notifications"
Algunas de las más frecuentes son:
steam %>%
select(55:83) %>%
summarise_all(sum) %>%
melt() %>%
arrange(-value) %>%
head(10)
## variable value
## 1 Single-player 25678
## 2 Steam Achievements 14130
## 3 Steam Trading Cards 7918
## 4 Steam Cloud 7219
## 5 Full controller support 5695
## 6 linux 5235
## 7 Partial Controller Support 4234
## 8 Multi-player 3974
## 9 Steam Leaderboards 3439
## 10 Online Multi-Player 2487
También se identificaron un total de 29 géneros distintos:
genres
## [1] "Action" "Free to Play" "Strategy"
## [4] "Adventure" "Indie" "RPG"
## [7] "Animation & Modeling" "Video Production" "Casual"
## [10] "Simulation" "Racing" "Violent"
## [13] "Massively Multiplayer" "Nudity" "Sports"
## [16] "Early Access" "Gore" "Utilities"
## [19] "Design & Illustration" "Web Publishing" "Education"
## [22] "Software Training" "Sexual Content" "Audio Production"
## [25] "Game Development" "Photo Editing" "Accounting"
## [28] "Documentary" "Tutorial"
Algunos de los anteriores corresponden a géneros de software y no necesariamente de juegos. Sin embargo, los más frecuentes se corresponden con géneros más bien conocidos de videojuegos.
(popular_genres <- steam %>%
select(84:112) %>%
summarise_all(sum) %>%
melt() %>%
arrange(-value) %>%
head(15))
## variable value
## 1 Indie 19421
## 2 Action 11903
## 3 Casual 10210
## 4 Adventure 10032
## 5 Strategy 5247
## 6 Simulation 5194
## 7 RPG 4311
## 8 Early Access 2954
## 9 Free to Play 1704
## 10 Sports 1322
## 11 Racing 1024
## 12 Violent 843
## 13 Massively Multiplayer 723
## 14 Gore 537
## 15 Nudity 266
Para distinguir de mejor forma los grupos se prefirió convertir el valor a numérico promediando ambos límites del rango entregado originalmente (dueños promedio).
owners <- str_split(steam$owners, "-")
owners <- unlist(owners)
owners <- unique(owners)
steam <- cSplit(steam, "owners", sep="-")
steam <- steam %>%
mutate(duenos_promedio = (owners_1 + owners_2)/2)
Sin embargo, para conocer cuántos juegos hay por rango:
owners_lbl <- c("0-20k", "20k-50k", "50k-100k", "100k-200k", "200k-500k", "500k-1M", "1M-2M", "2M-5M", "5M-10M", "10M-20M", "20M-50M", "50M-100M", "100M-200M")
steam %>%
group_by(duenos_promedio) %>%
summarise(n=n()) %>%
ggplot() +
scale_y_log10() +
geom_bar(aes(x=as.factor(duenos_promedio), y=n), stat="identity") +
scale_x_discrete(labels=owners_lbl) +
ylab("cantidad") +
xlab("rangos de cantidad de dueños") +
coord_flip()
En este apartado se realizan transformaciones logarítmicas a algunas variables para suavizar las observaciones y distribuciones.
steam %>%
filter(price < 50000 & duenos_promedio < 50000000 & duenos_promedio > 0) %>%
ggplot(aes(x=log(price),y=log(duenos_promedio))) +
geom_point(aes(alpha=0.05), show.legend = F) +
xlab("precio (CLP)") +
ylab("log(dueños promedio)")
En general, los juegos tienden a tener precios bajos; conforme crecen tienden a agruparse en ciertos precios “estándar”. Por otro lado, los juegos con más descargas son gratis, concentrándose hacia precios cada vez más pequeños conforme aumentan los rangos de dueños. A pesar de lo anterior, no se aprecia una correlación clara entre las variables.
steam %>%
filter(price<100000) %>%
ggplot(aes(x=log(price),y=log(positive_ratings))) +
geom_point() +
xlab("precio (CLP)") +
ylab("log(ratings positivos)")
Al igual que en el ejemplo anterior no se aprecia una correlación clara entre log(precio) y log(ratings_positivos) y si la hubiera, pareciera ser levemente positiva entre las dos variables.
steam %>%
group_by(developer) %>%
summarise(media_pos = mean(positive_ratings)) %>%
arrange(-media_pos) %>%
head(10)
## # A tibble: 10 x 2
## developer media_pos
## <fct> <dbl>
## 1 Valve;Hidden Path Entertainment 2644404
## 2 PUBG Corporation 496184
## 3 OVERKILL - a Starbreeze Studio. 308657
## 4 Smartly Dressed Games 292574
## 5 Re-Logic 255600
## 6 Psyonix, Inc. 242561
## 7 Evil Mojo Games 169580
## 8 Facepunch Studios 146078.
## 9 Studio Wildcard;Instinct Games;Efecto Studios;Virtual Basement LLC 145035
## 10 Gearbox Software;Aspyr (Mac);Aspyr (Linux) 144595
steam %>%
group_by(developer) %>%
summarise(media_neg = mean(negative_ratings)) %>%
arrange(-media_neg) %>%
head(10)
## # A tibble: 10 x 2
## developer media_neg
## <fct> <dbl>
## 1 PUBG Corporation 487076
## 2 Valve;Hidden Path Entertainment 402313
## 3 NantG 91664
## 4 Studio Wildcard;Instinct Games;Efecto Studios;Virtual Basement LLC 66603
## 5 OVERKILL - a Starbreeze Studio. 56523
## 6 Rockstar North 34947
## 7 RETO MOTO 34416
## 8 Evil Mojo Games 32407
## 9 Smartly Dressed Games 31482
## 10 Ubisoft Montreal;Ubisoft Quebec;Ubisoft Toronto;Blue Byte 25920
steam %>%
select(c(1,84:112,14)) %>%
melt(id = c("appid","price")) %>%
filter(value ==1) %>%
group_by(variable) %>%
summarise(media_precio_genero = mean(price)) %>%
arrange(-media_precio_genero) %>%
head(10)
## # A tibble: 10 x 2
## variable media_precio_genero
## <fct> <dbl>
## 1 Game Development 66923.
## 2 Web Publishing 43070.
## 3 Software Training 34505.
## 4 Animation & Modeling 30084.
## 5 Design & Illustration 29097.
## 6 Education 29066.
## 7 Photo Editing 15888
## 8 Utilities 15616.
## 9 Video Production 12285.
## 10 Audio Production 12210.
steam %>%
select(c(1,84:112,14)) %>%
melt(id = c("appid","price")) %>%
filter(value ==1) %>%
group_by(variable) %>%
summarise(media_precio_genero = mean(price)) %>%
arrange(-media_precio_genero) %>%
head(10) %>%
ggplot(aes(reorder(variable,-media_precio_genero),media_precio_genero)) +
geom_bar(stat = 'identity') +theme(axis.text.x = element_text(angle = 90)) +
xlab("géneros") +
ylab("precio medio")
steam %>%
select(c(1,84:112,14)) %>%
melt(id = c("appid","price")) %>%
filter(value ==1) %>%
group_by(variable) %>%
summarise(media_precio_genero = mean(price)) %>%
arrange(media_precio_genero) %>%
head(10)
## # A tibble: 10 x 2
## variable media_precio_genero
## <fct> <dbl>
## 1 Free to Play 108.
## 2 Accounting 3157.
## 3 Documentary 4318
## 4 Tutorial 4318
## 5 Casual 4455.
## 6 Massively Multiplayer 4687.
## 7 Indie 5479.
## 8 Gore 6480.
## 9 Adventure 6642.
## 10 Action 6662.
steam %>%
select(c(1,84:112,14)) %>%
melt(id = c("appid","price")) %>%
filter(value ==1) %>%
group_by(variable) %>%
summarise(media_precio_genero = mean(price)) %>%
arrange(media_precio_genero) %>%
head(10) %>%
ggplot(aes(reorder(variable,media_precio_genero),media_precio_genero)) +
geom_bar(stat = 'identity') +theme(axis.text.x = element_text(angle = 90)) +
xlab("géneros") +
ylab("precio medio")
Algo particular de notar es que los juegos “free to play” tienen muy bajos precios pero se esperaría que fueran totalmente gratis (es decir, iguales a 0). Analizando un poco más detalle podemos ver que los 5 juegos más caros de la categoría “free to play” presentan precios bastantes más altos que 0. Esto nos lleva a pensar que puede estar ocurriendo que ciertas etiquetas de género estén mal identificadas o que existen juegos que hayan cambiado de género pero que el cambio no se haya visto reflejado en la base de datos.
steam %>%
filter(`Free to Play` == 1) %>%
select(name,price) %>%
arrange(-price) %>%
head(5)
## name price
## 1: VR Paradise 21689
## 2: Sexy Miss 15179
## 3: Invisigun Heroes 12358
## 4: Apocalypse Mechanism 12358
## 5: Conqueror's Blade 12358
steam %>%
select(c(1,84:112,118)) %>%
melt(id = c("appid","duenos_promedio")) %>%
filter(value ==1) %>%
group_by(variable) %>%
summarise(media_duenos_genero = mean(duenos_promedio)) %>%
arrange(-media_duenos_genero) %>%
head(10)
## # A tibble: 10 x 2
## variable media_duenos_genero
## <fct> <dbl>
## 1 Massively Multiplayer 617220.
## 2 Free to Play 592667.
## 3 Action 198411.
## 4 RPG 161648.
## 5 Animation & Modeling 150759.
## 6 Strategy 146379.
## 7 Design & Illustration 126897.
## 8 Adventure 109823.
## 9 Utilities 102158.
## 10 Simulation 101261.
steam %>%
select(c(1,84:112,118)) %>%
melt(id = c("appid","duenos_promedio")) %>%
filter(value ==1) %>%
group_by(variable) %>%
summarise(media_duenos_genero = mean(duenos_promedio)) %>%
arrange(media_duenos_genero) %>%
head(10)
## # A tibble: 10 x 2
## variable media_duenos_genero
## <fct> <dbl>
## 1 Documentary 10000
## 2 Tutorial 10000
## 3 Accounting 14167.
## 4 Audio Production 14828.
## 5 Education 29706.
## 6 Photo Editing 33333.
## 7 Software Training 35806.
## 8 Game Development 39706.
## 9 Gore 48017.
## 10 Violent 48553.
if (!require('corrplot')) install.packages('corrplot'); library('corrplot')
steam %>%
mutate(rating_neto = positive_ratings - negative_ratings) %>%
select(positive_ratings,negative_ratings,rating_neto,average_playtime,median_playtime,
price,duenos_promedio) %>%
cor()
## positive_ratings negative_ratings rating_neto average_playtime
## positive_ratings 1.00000000 0.76280427 0.98481975 0.15789760
## negative_ratings 0.76280427 1.00000000 0.63898269 0.16113987
## rating_neto 0.98481975 0.63898269 1.00000000 0.14457660
## average_playtime 0.15789760 0.16113987 0.14457660 1.00000000
## median_playtime 0.03577591 0.04788714 0.02970377 0.91490024
## price 0.03610949 0.05125866 0.02919554 0.04924223
## duenos_promedio 0.71344799 0.69030563 0.66340301 0.17415654
## median_playtime price duenos_promedio
## positive_ratings 0.03577591 0.03610949 0.71344799
## negative_ratings 0.04788714 0.05125866 0.69030563
## rating_neto 0.02970377 0.02919554 0.66340301
## average_playtime 0.91490024 0.04924223 0.17415654
## median_playtime 1.00000000 0.03661012 0.03598315
## price 0.03661012 1.00000000 0.03107103
## duenos_promedio 0.03598315 0.03107103 1.00000000
steam %>%
mutate(rating_neto = positive_ratings - negative_ratings) %>%
select(positive_ratings,negative_ratings,rating_neto,average_playtime,median_playtime,
price,duenos_promedio) %>%
cor() %>%
corrplot()
Con la información anterior podemos notar que la variable price no está fuertemente correlacionada con ninguna variable. Por otro lado, un aspecto interesante es el hecho que la cantidad de dueños promedio está fuertemente correlacionada positivamente con las variables de ratings. Esto hace concluir que la cantidad de ratings (ya sean positivos o negativos) podrían estar reflejando la popularidad de los juegos.
steam %>%
select(appid,price,Indie,Action,Casual,Adventure,Strategy) %>%
melt(id = c("appid","price")) %>%
group_by(variable) %>%
filter(value == 1 & price<=20000) %>%
ggplot(aes(variable,price)) +
geom_boxplot() +
xlab("géneros") +
ylab("precio")
if (!require('plotly')) install.packages('plotly'); library('plotly')
steam %>%
select(appid,price,year,duenos_promedio,Indie,Action,Casual,Adventure,Strategy) %>%
melt(id = c("appid","price","year","duenos_promedio")) %>%
filter(value == 1 & year >=2006) %>%
group_by(variable, year) %>%
summarise(q_juegos = n()) %>%
plot_ly(x=~year ,y = ~q_juegos,group = ~variable, color = ~variable ,type = "scatter" ,mode='lines+markers') %>%
layout(xaxis=list(title="año"), yaxis=list(title="cantidad"))
steam %>%
select(appid,price,year,duenos_promedio,Indie,Action,Casual,Adventure,Strategy) %>%
melt(id = c("appid","price","year","duenos_promedio")) %>%
filter(value == 1 & year >=2006) %>%
group_by(variable, year) %>%
summarise(media_duenos = mean(duenos_promedio)) %>%
plot_ly(x=~year ,y = ~media_duenos,group = ~variable, color = ~variable ,type = "scatter" ,mode='lines+markers') %>% layout(xaxis = list(range=c(2006,2020))) %>%
layout(xaxis=list(title="año"), yaxis=list(title="cantidad de dueños media"))
steam %>%
select(appid,price,year,duenos_promedio,Indie,Action,Casual,Adventure,Strategy) %>%
melt(id = c("appid","price","year","duenos_promedio")) %>%
filter(value == 1 & year >=2007) %>%
group_by(variable, year) %>%
summarise(media_duenos = mean(duenos_promedio)) %>%
plot_ly(x=~year ,y = ~media_duenos,group = ~variable, color = ~variable ,type = "scatter" ,mode='markers', frame = ~year, size = 10) %>%
layout(xaxis=list(title="año"), yaxis=list(title="cantidad de dueños media"))
¿Cómo ha evolucionado la cantidad de juegos que lanzan los desarrolladores en el tiempo?
¿Cómo decidir que un juego es/será popular entre los jugadores?
¿Qué factores afectan más en producir altos tiempos de juego? (cantidad de achievements o juegos multiplayer por ejemplo)
¿Cuáles son los géneros de juegos indie que producen más engagement? (mayores playtimes y más owners)